package com.zzw.oa.controller;


import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.zzw.common.result.Result;
import com.zzw.model.process.ProcessTemplate;
import com.zzw.model.process.ProcessType;
import com.zzw.oa.service.OaProcessTemplateService;
import com.zzw.oa.service.OaProcessTypeService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.ResourceUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.Socket;
import java.net.URL;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * 审批模板 前端控制器
 * </p>
 *
 * @author zzw
 * @since 2023-05-04
 */
@Api(tags = "流程模版管理")
@RestController
@RequestMapping("admin/oa/processTemplate")
public class OaProcessTemplateController {

    @Autowired
    private OaProcessTemplateService oaProcessTemplateService;
    @Autowired
    private OaProcessTypeService oaProcessTypeService;


    @ApiOperation(value = "删除流程模版")
    @DeleteMapping("removeType/{id}")
    public Result removeType(@PathVariable Long id) {
        if (oaProcessTemplateService.removeById(id)) {
            return Result.ok();
        }
        return Result.fail();
    }


    //    添加流程模版的步骤
//    1，根据前端要求先查找所有流程类型
    @ApiOperation("查找所有流程类型")
    @GetMapping("/findAllType")
    public Result findAllType(){
        return Result.ok(oaProcessTypeService.list());
    }

//    2.根据前端要求添加activiti的zip文件
    @ApiOperation("添加ctiviti的zip文件")
    @PostMapping("saveType")
    public Result updateFile( MultipartFile file) throws FileNotFoundException {
        //springboot中的工具类ResourceUtils可以得到文件的具体路径
        String path= new File(ResourceUtils.getURL("classpath:").getPath()).getAbsolutePath();//可以得到文件下的Resource目录路径
//        获取前端传来文件的名称+后缀名
        String fileName = file.getOriginalFilename();
//        上传目录
        File temFile=new File(path+"/process/");
//        如果文件夹不存在，则创建
        if(!temFile.exists()){
            temFile.mkdir();
        }
       File zipFile= new File(path+"/process/"+fileName);
        try {
//            文件转换
            file.transferTo(zipFile);
        } catch (IOException e) {
            e.printStackTrace();
            Result.fail("上传失败");
        }
        Map<String, Object> map = new HashMap<>();
        //根据上传地址后续部署流程定义，文件名称为流程定义的默认key
        map.put("processDefinitionPath", "processes/" + fileName);
        map.put("processDefinitionKey", fileName.substring(0, fileName.lastIndexOf(".")));
        return Result.ok(map);

    }
//    3.添加 ==》前端可以使用from-create集成类库生成动态表单
//    from-create：
//    可以通过拖拽的方式快速配置动态表单，配置好的动态表单可以通过：
//    生成JSON与生成Options获取数据，这两数据对于表字段：form_props与form_options，
    @ApiOperation("添加流程模板")
    @PostMapping("saveTemplate")
    public Result saveType(@RequestBody ProcessTemplate processTemplate) {

        if (oaProcessTemplateService.save(processTemplate)) {
            return Result.ok();
        }
        return Result.fail();
    }


    @ApiOperation("发布（部署流程定义）")
    @GetMapping("push")
    public Result push(Long id) {
//        status: 1代表已发布， 0代表未发布
        oaProcessTemplateService.publish(id);
        return Result.ok();
    }



    //    修改流程模版的步骤
//    1.根据id查找流程模版
    @ApiOperation("根据id查找流程模版")
    @PostMapping("fidTypeById/{id}")
    public Result<ProcessTemplate> findTypeById(@PathVariable Long id) {
        return Result.ok(oaProcessTemplateService.getById(id));
    }

    //    2.最终修改
    @ApiOperation("修改流程模版")
    @PutMapping("updateType")
    public Result updateUser(@RequestBody ProcessTemplate processTemplate) {
        if (oaProcessTemplateService.updateById(processTemplate)) {
            return Result.ok();
        }
        return Result.fail();
    }
    //    @RequestBody传入为json格式
    //    json格式中的数组对于java的list集合
    @ApiOperation("批量删除")
    @DeleteMapping("batchRemove")
    public Result batchRemove(@RequestBody List<Long> ids) {
        if (oaProcessTemplateService.removeByIds(ids)) {

            return Result.ok();
        }
        return Result.fail();
    }


    @ApiOperation("获取分页列表")
    @GetMapping("{page}/{limit}")
    public Result findPageQueryType(
            @ApiParam(name = "page", value = "当前页码", required = true)
            @PathVariable Long page,
            @ApiParam(name = "limit",value = "每页记录数",required = true)
            @PathVariable Long limit
    )
    {
        Page<ProcessTemplate> pageParam=new Page<>(page,limit);
        IPage<ProcessTemplate> pageMode= oaProcessTemplateService.pageProcessTemplate(pageParam);
        return Result.ok(pageMode);
    }

}
